package cn.com.haopy.yue.ai.comm.service;


import cn.com.haopy.yue.ai.core.config.HumanApiProperties;
import cn.com.haopy.yue.ai.core.utils.HttpUtils;
import cn.com.haopy.yue.ai.core.utils.ResponseUtil;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * Ai聊听会话接口
 */
@Service
@Slf4j
public class HumanApiService {

    @Autowired
    private HumanApiProperties humanApiProperties;


    /**
     * 获取Token（前后端通用）
     * <p>
     * 通过HTTP GET请求调用远程接口【/guiji/createSig】获取Token签名。
     * </p>
     *
     * @return 使用ResponseUtil封装后的签名信息
     * @throws Exception 请求过程中可能抛出的异常
     */
    public Object sign() throws Exception {
        // 调用远程接口获取签名，不需要额外参数
        String sign = HttpUtils.get(humanApiProperties.getUrl() + "/guiji/createSig", null, null);
        // 对结果进行封装返回
        return ResponseUtil.ok(sign);
    }

    /**
     * 关闭指定uuid的会话
     * <p>
     * 此接口用于关闭指定UUID对应的会话，需要传入会话标识uuid和可选的token值。
     * </p>
     *
     * @param sign 可选的token，默认值为空字符串
     * @param uuid 必传的会话uuid
     * @return 通过远程接口调用返回的结果
     * @throws Exception 处理过程中可能抛出的异常
     */
    public Object sessionStop(String sign, String uuid) throws Exception {
        // 构建请求参数，将token和uuid放入Map
        Map<String, String> params = new HashMap<>();
        params.put("token", sign);
        params.put("uuid", uuid);

        // 调用远程HTTP GET接口，注意这里的请求路径与接口文档一致
        String result = HttpUtils.get(humanApiProperties.getUrl() + "/guiji/sessionStop", params, null);
        // 转换为json
        JSONObject jsonObject = JSONObject.parseObject(result);
        if (jsonObject.getBoolean("success")){
            return ResponseUtil.ok() ;
        }
        // 返回封装后的结果
        return ResponseUtil.fail();
    }

    /**
     * 获取可以使用的通道数和正在使用的通道数
     * <p>
     * 调用远程接口【/guiji/getconcurrentNumber】，传入可选的token，获取当前的通道使用情况。
     * </p>
     *
     * @param sign 可选的sign，数字人签名默认值为空字符串
     * @return 返回调用远程接口获取的结果，包含通道数信息
     * @throws Exception 请求过程中可能抛出的异常
     */
    @GetMapping("/getConcurrentNumber")
    @ApiOperation(value = "获取可以使用的通道数和正在使用的通道数")
    public Object getconcurrentNumber(String sign) throws Exception {

        // 构建参数Map，仅包含token
        Map<String, String> params = new HashMap<>();
        params.put("token", sign);

        // 执行GET请求获取结果
        String result = HttpUtils.get(humanApiProperties.getUrl() + "/guiji/getconcurrentNumber", params, null);
        // 对结果进行统一封装返回
        // 转换为json
        JSONObject jsonObject = JSONObject.parseObject(result).getJSONObject("data");
        if (Objects.nonNull(jsonObject)) {
            if (Objects.isNull(jsonObject.getInteger("userConcurrentNumber"))) {
                jsonObject.put("userConcurrentNumber", 0);
            }
        }

        // 返回封装后的结果
        return ResponseUtil.ok(jsonObject);
    }

    /**
     * 获取当前的会话列表
     * <p>
     * 此接口通过调用【/guiji/getconcurrentList】远程接口，查询当前所有正在运行的会话，
     * 可选参数token用于身份校验或其他用途。
     * </p>
     *
     * @param sign 可选的token，默认值为空字符串
     * @return 返回当前会话列表的查询结果
     * @throws Exception 请求过程中可能抛出的异常
     */

    public Object getconcurrentList(String sign) throws Exception {

        // 构建请求参数，只包含token
        Map<String, String> params = new HashMap<>();
        params.put("token", sign);

        // 远程调用获取当前会话列表信息
        String result = HttpUtils.get(humanApiProperties.getUrl() + "/guiji/getconcurrentList", params, null);
        // 包装返回结果
        // 转换为json
        JSONObject jsonObject = JSONObject.parseObject(result);
        // 返回封装后的结果
        return ResponseUtil.ok(jsonObject);
    }

    /**
     * 一口气关闭所有会话
     * <p>
     * 该接口用于一次性关闭所有会话，调用【/guiji/distroyCallSessionsByAppId】接口，
     * 可选参数token用于身份识别。
     * </p>
     *
     * @param sign 可选的token，默认值为空字符串
     * @return 返回关闭所有会话的操作结果
     * @throws Exception 请求处理过程中可能抛出的异常
     */
    public Object distroyCallSessionsByAppId(String sign) throws Exception {

        // 构造请求参数Map，仅包含token
        Map<String, String> params = new HashMap<>();
        params.put("token", sign);

        // 调用远程服务执行一次性关闭所有会话的操作
        String result = HttpUtils.get(humanApiProperties.getUrl() + "/guiji/distroyCallSessionsByAppId", params, null);
        // 返回统一封装的结果
        // 转换为json
        JSONObject jsonObject = JSONObject.parseObject(result);
        // 返回封装后的结果
        return ResponseUtil.ok(jsonObject);
    }


}
